function Star(name, age) {
    // 通过this添加的成员就是实例成员
    // 只能被new实例对象访问。例如ldh.name
    // 不能被构造函数访问
    this.age = age;
    this.name = name
    // this.sing = function() {
    //     console.log('我会唱歌')
    // }
}

// 每一个构造函数都有一个原型对象
// 由于实例成员会分配在不同的实例对象内存中，有些耗内存，因此把一些功能相同的方法放在原型对象中，会节省内存
Star.prototype.sing = function () {
    console.log(this.name)
    console.log('我会唱歌')
}

// 千万不要这么干，这样会把prototype的constructor干掉
// 因为它会重新分配内存空间
// Star.prototype = {}

// 如果非得这么干，那就要添加constructor属性指向Star
// Star.prototype = { constructor: Star, sing: function(){} }

const ldh = new Star('刘德华', 18)
const zxy = new Star('张学友', 18)
console.log('ldh', ldh)
console.log(ldh.sing === zxy.sing) // true
console.log(ldh.__proto__ === Star.prototype) // true
console.log(111111, ldh.__proto__.constructor === Star)

console.log('Star.prototype', Star.prototype)

// 静态成员
// 只能通过构造函数访问，new实例对象不能访问
Star.haha = '我只是想笑';

console.log(ldh.haha)
console.log(ldh.__proto__.constructor.haha)

// 原型链
console.log(Star.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__) // null

// this的指向
// 在构造函数中，里面的this指向的是对象实例gtl
// 原型对象函数（比如sing）里面的this指向的是gtl
const gtl = new Star('古天乐', 18)
gtl.sing()

